home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
turbovis
/
oodb.zip
/
DBDEMO.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-04-29
|
18KB
|
597 lines
uses Objects, Drivers, Views, Menus, Dialogs, App, Layout, OODB;
const
DBFileName = 'dbdemo.dat';
MaxLen = 25;
CollLimit = $7F; CollDelta = 4;
InvPID = 1;
cmInfo = 100;
cmOpen = 101;
cmShut = 102;
cmStat = 103;
cmCreate = 105;
cmGet = 106;
cmDelete = 107;
cmCommit = 108;
cmAbort = 109;
type
NameString = String [MaxLen];
ModDialData =
record
NameData : NameString
end;
TInvCard =
record
Name : NameString;
ID : Word
end;
PInvCard = ^TInvCard;
{ ----- TCatCollection ----- }
TCatCollection =
object (TSortedCollection)
procedure FreeItem (Item: Pointer); virtual;
function GetItem (var S: TStream): Pointer; virtual;
procedure PutItem (var S: TStream; Item: Pointer); virtual;
function Compare (Key1, Key2 : Pointer): Integer; virtual;
end;
PCatCollection = ^TCatCollection;
{ ----- TDemoApplication class ----- }
TDemoApplication =
object (TApplication)
DB : PBase;
DBFile : PDosStream;
constructor Init;
destructor Done; virtual;
procedure InitMenuBar; virtual;
procedure InitStatusLine; virtual;
procedure HandleEvent (var Event: TEvent); virtual;
procedure Idle; virtual;
function NameDialog (Title: TTitleStr):
PDialog; virtual;
procedure About; virtual;
procedure OpenDB; virtual;
procedure ShutDB; virtual;
procedure StatInfo; virtual;
procedure CreateMod; virtual;
procedure GetMod; virtual;
procedure DeleteMod; virtual;
procedure Commit; virtual;
procedure Rollback; virtual;
end;
PDemoApplication = ^TDemoApplication;
{ -- Implementation of TCatCollection -- }
procedure TCatCollection.FreeItem (Item: Pointer);
begin
Dispose (Item)
end; { FreeItem }
function TCatCollection.GetItem (var S: TStream): Pointer;
var Item : PInvCard;
begin
New (Item);
with S do
with Item^ do
begin
Read (Name, SizeOf(Name));
Read (ID, SizeOf(ID))
end;
GetItem := Item
end; { GetItem }
procedure TCatCollection.PutItem (var S: TStream; Item: Pointer);
begin
with S do
with TInvCard(Item^) do
begin
Write (Name, SizeOf(Name));
Write (ID, SizeOf(ID))
end
end; { PutItem }
function TCatCollection.Compare (Key1, Key2 : Pointer): Integer;
var
N1, N2 : NameString;
begin
N1 := TInvCard(Key1^).Name; N2 := TInvCard(Key2^).Name;
if N1 > N2
then Compare := 1
else if N1 < N2
then Compare := -1
else Compare := 0
end; { Compare }
{ -- End of TCatCollection implementation -- }
{ ----- TDemoApplication implementation ----- }
{ ----- Init ----- }
constructor TDemoApplication.Init;
begin
TApplication.Init;
DB := nil
end;
{ ----- Done ----- }
destructor TDemoApplication.Done;
begin
if DB <> nil
then begin
Dispose (DB, Done);
Dispose (DBFile, Done)
end;
TApplication.Done
end;
{ ----- InitMenuBar ----- }
procedure TDemoApplication.InitMenuBar;
var
MenuRect: TRect;
begin
GetExtent (MenuRect);
MenuRect.B.Y := MenuRect.A.Y + 1;
MenuBar := New (PMenuBar, Init (MenuRect, NewMenu (
NewItem ( '~I~nfo', '', kbNoKey, cmInfo, hcNoContext,
NewSubMenu ( '~D~atabase', hcNoContext, NewMenu (
NewItem ( '~O~pen', 'F3', kbF3, cmOpen, hcNoContext,
NewItem ( '~S~hut', 'F4', kbF4, cmShut, hcNoContext,
NewItem ( 'S~t~atistics', '', kbNoKey, cmStat, hcNoContext,
NewLine (
NewItem ( '~E~xit', 'Alt-X', kbAltX, cmQuit, hcNoContext,
nil )))))),
NewSubMenu ( '~M~odules', hcNoContext, NewMenu (
NewItem ( '~C~reate', 'F5', kbF5, cmCreate, hcNoContext,
NewItem ( '~G~et', 'F6', kbF6, cmGet, hcNoContext,
NewItem ( '~D~elete', '', kbNoKey, cmDelete, hcNoContext,
nil )))),
NewSubMenu ( '~T~ransaction', hcNoContext, NewMenu (
NewItem ( '~C~ommit', '', kbNoKey, cmCommit, hcNoContext,
NewItem ( '~R~ollback', '', kbNoKey, cmAbort, hcNoContext,
nil ))),
nil )))))))
end;
{ ----- InitStatusLine ----- }
procedure TDemoApplication.InitStatusLine;
var
StatusRect: TRect;
begin
GetExtent (StatusRect);
StatusRect.A.Y := StatusRect.B.Y - 1;
StatusLine := New (PStatusLine, Init (StatusRect,
NewStatusDef (0, $FFFF,
NewStatusKey ('~Alt-X~ - Exit', kbAltX, cmQuit,
NewStatusKey ('~F3~ - Open database', kbF3, cmOpen,
NewStatusKey ('~F10~ - Menu', kbF10, cmMenu,
nil ))),
nil )))
end;
{ ----- HandleEvent ----- }
procedure TDemoApplication.HandleEvent (var Event: TEvent);
begin
TApplication.HandleEvent (Event);
with Event do
if What = evCommand
then begin
case Command of
cmInfo : About;
cmOpen : OpenDB;
cmShut : ShutDB;
cmStat : StatInfo;
cmCreate : CreateMod;
cmGet : GetMod;
cmDelete : DeleteMod;
cmCommit : Commit;
cmAbort : Rollback;
else
Exit
end;
ClearEvent (Event)
end
end;
{ ----- Idle ----- }
procedure TDemoApplication.Idle;
begin
TApplication.Idle;
if DB <> nil
then DB^.IdlePack
end;
{ ----- NameDialog ----- }
function TDemoApplication.NameDialog (Title: TTitleStr): PDialog;
var
X, Y : Word;
R : TRect;
Dial : PDialog;
Bruce : PView;
begin
if DB = nil
then begin
HandleError ( ^C'Open database at first !' );
NameDialog := nil;
Exit
end;
Randomize;
X := 2 + Random (50); Y := 2 + Random (12);
R.Assign (X,Y,X+28,Y+9);
New (Dial, Init (R, Title));
with Dial^ do
begin
R.Assign (2,6,12,8);
Insert (New (PButton, Init (R, '~O~k', cmOK, bfDefault)));
R.Assign (14,6,24,8);
Insert (New (PButton,
Init (R, '~C~ancel', cmCancel, bfNormal)));
R.Assign (3,3,25,4);
Bruce := New (PInputLine, Init (R, Max